package movepaint.view;

import movepaint.stateMachine.InkMachine;
import movepaint.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Map;
import java.util.Iterator;
import movepaint.listener.MenuListener;
import movepaint.view.menuComponents.JMenuItemRaccourci;
import movepaint.utils.Utilitaire;

/**
 * Classe représentant le menu de l'application.
 *
 * @author Paulino A.
 * @version 1.0
 **/
public class MenuMain extends JMenuBar{
    /**	Identificateur pour chaque menu **/
	public static final int ID_NOUVEAU = 1;
	public static final int ID_OUVRIR = 2;
	public static final int ID_ENREGISTER = 3;
	public static final int ID_ENREGISTRER_SOUS = 4;
	public static final int ID_IMPRIMER = 5;
	public static final int ID_QUITTER = 6;

	public static final int ID_COPIER = 7;
	public static final int ID_COLLER = 8;
	public static final int ID_TOUS_SELECTIONNER = 9;
    public static final int ID_EFFACER = 10;
	public static final int ID_PREFERENCE = 11;

	public static final int ID_A_PROPOS = 12;
	public static final int ID_MANUEL = 13;
	public static final int ID_PAGE_ACCUEIL = 14;
	public static final int ID_LOOK = 15;

	/** Texte pour chaque menu **/
	public static final String TEXT_FICHIER = "Fichier";
	public static final String TEXT_EDITION = "Edition";
	public static final String TEXT_AIDE = "Aide";

	public static final String TEXT_NOUVEAU = "Nouveau";
	public static final String TEXT_OUVRIR = "Ouvrir...";
	public static final String TEXT_ENREGISTRER = "Enregistrer";
	public static final String TEXT_ENREGISTRER_SOUS = "Enregister sous...";
	public static final String TEXT_IMPRIMER = "Imprimer";
	public static final String TEXT_QUITTER = "Quitter";

	public static final String TEXT_COPIER = "Copier";
	public static final String TEXT_COLLER = "Coller";
	public static final String TEXT_TOUS_SELECT = "Tout selectionner";
    public static final String TEXT_EFFACER = "Effacer la sélection";
	public static final String TEXT_PREFERENCE = "Preferences";

	public static final String TEXT_A_PROPOS = "A propos";
	public static final String TEXT_MANUEL = "Manuel";
	public static final String TEXT_PAGE_ACCUEIL = "Page d'accueil";
	public static final String TEXT_LOOK = "Look and Feel";

	/** Icone pour chaque menu **/
	public static final String ICON_NOUVEAU = "new.gif";
	public static final String ICON_OUVRIR = "open.gif";
	public static final String ICON_ENREGISTRER = "save.gif";
	public static final String ICON_ENREGISTRER_SOUS = "saveas.gif";
	public static final String ICON_IMPRIMER = "print.gif";
	public static final String ICON_QUITTER = "exit.gif";

	public static final String ICON_COPIER = "copy.gif";
	public static final String ICON_COLLER = "paste.gif";
	public static final String ICON_TOUS_SELECT = "NA";
    public static final String ICON_EFFACER = "delete.gif";
	public static final String ICON_PREFERENCE = "preferences.gif";

	public static final String ICON_A_PROPOS = "info.gif";
	public static final String ICON_MANUEL = "manuel.gif";
	public static final String ICON_PAGE_ACCUEIL = "accueil.gif";

	// référence a la frame principale
 	private GestureRecognition _frameMain = null;

    // Déclarations des différents menus
    private JMenu _menuFichier;
    private JMenu _menuLF;
    private JMenu _menuEdition;
    private JMenu _menuAide;

    // Déclaration des items des menus
	private ArrayList <JMenuItem>_itemMenuFichier = null;
	private ArrayList <JMenuItem>_itemMenuLF = null;
	private ArrayList <JMenuItem>_itemMenuEdition = null;
	private ArrayList <JMenuItem>_itemMenuAide = null;

    // Timer qui va mettre à jour les items du menu
    private Timer timer = null;

	// Temps d'attente du timer
	private final static int SLEEP_TIME = 1000;

	/**
	 *	Constructeur du menu.
	 *
	 *	@param frameMain
	 *			Référence à la frame principale de l'application
	 *
	 **/
    public MenuMain(GestureRecognition frameMain) {
    	//	Référence à la frame principale
    	_frameMain = frameMain;

		// On créer les composants
		createComponents();

		// On place les composants
		placeComponents();


		/*
		 *	Ajout des écouteurs aux items des menus
		 */
		// Menu 'Fichier'
		_itemMenuFichier.get(0).addActionListener(new MenuListener(_frameMain,ID_NOUVEAU));
		_itemMenuFichier.get(1).addActionListener(new MenuListener(_frameMain,ID_OUVRIR));
		_itemMenuFichier.get(2).addActionListener(new MenuListener(_frameMain,ID_ENREGISTER));
		_itemMenuFichier.get(3).addActionListener(new MenuListener(_frameMain,ID_ENREGISTRER_SOUS));
		_itemMenuFichier.get(4).addActionListener(new MenuListener(_frameMain,ID_IMPRIMER));
		_itemMenuFichier.get(5).addActionListener(new MenuListener(_frameMain,ID_QUITTER));

        // Menu Edition
        _itemMenuEdition.get(0).addActionListener(new MenuListener(_frameMain,ID_COPIER));
        _itemMenuEdition.get(1).addActionListener(new MenuListener(_frameMain,ID_COLLER));
        _itemMenuEdition.get(2).addActionListener(new MenuListener(_frameMain,ID_EFFACER));
        _itemMenuEdition.get(3).addActionListener(new MenuListener(_frameMain,ID_TOUS_SELECTIONNER));
        _itemMenuEdition.get(4).addActionListener(new MenuListener(_frameMain,ID_PREFERENCE));

		// Menu 'Look&Feel'
		Iterator iter = _itemMenuLF.iterator ();
		int numLook = 0;
		while (iter.hasNext ())
			((JMenuItem)iter.next ()).addActionListener(new MenuListener(_frameMain,ID_LOOK));

		// Menu 'A propos'
		_itemMenuAide.get(0).addActionListener(new MenuListener(_frameMain,ID_MANUEL));
		_itemMenuAide.get(1).addActionListener(new MenuListener(_frameMain,ID_PAGE_ACCUEIL));
		_itemMenuAide.get(2).addActionListener(new MenuListener(_frameMain,ID_A_PROPOS));

        // On démarre le Timer
        timer.start();
    }

 	/**
	 *	Cette méthode créer les composants de la fenetre
	 */
	private void createComponents() {
        /*
         *	Création des menus
         */
		_menuFichier = new JMenu(TEXT_FICHIER);
        _menuEdition = new JMenu(TEXT_EDITION);
		_menuLF = new JMenu(TEXT_LOOK);
		_menuAide = new JMenu(TEXT_AIDE);

        /*
         *	Création des items de menu
         */
        _itemMenuFichier = new ArrayList<JMenuItem>();
        _itemMenuLF = new ArrayList<JMenuItem>();
        _itemMenuEdition = new ArrayList<JMenuItem>();
        _itemMenuAide = new ArrayList<JMenuItem>();

		_itemMenuFichier.add( new JMenuItemRaccourci(TEXT_NOUVEAU,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_NOUVEAU),
											KeyEvent.VK_N,KeyEvent.CTRL_MASK,"Creer une nouvelle zone de dessin"));
		_itemMenuFichier.add( new JMenuItemRaccourci(TEXT_OUVRIR,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_OUVRIR),
											KeyEvent.VK_O,KeyEvent.CTRL_MASK,"Ouvrir une image"));
		_itemMenuFichier.add( new JMenuItemRaccourci(TEXT_ENREGISTRER,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_ENREGISTRER),
											KeyEvent.VK_S,KeyEvent.CTRL_MASK,"Enregistrer la zone de dessin actuelle"));
		_itemMenuFichier.add( new JMenuItemRaccourci(TEXT_ENREGISTRER_SOUS,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_ENREGISTRER_SOUS),
                                                "Enregistrer la zone de dessin actuelle"));

		_itemMenuFichier.add( new JMenuItemRaccourci(TEXT_IMPRIMER,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_IMPRIMER),
											KeyEvent.VK_I,KeyEvent.CTRL_MASK,
											"Imprimer la zone de dessin"));
		_itemMenuFichier.add( new JMenuItemRaccourci(TEXT_QUITTER,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_QUITTER),
                                            KeyEvent.VK_Q,KeyEvent.CTRL_MASK));

        // Items du menu Edition
		_itemMenuEdition.add( new JMenuItemRaccourci(TEXT_COPIER,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_COPIER),
											KeyEvent.VK_C,KeyEvent.CTRL_MASK,"Copier un element"));
		_itemMenuEdition.add( new JMenuItemRaccourci(TEXT_COLLER,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_COLLER),
											KeyEvent.VK_V,KeyEvent.CTRL_MASK,"Coller un element"));
        _itemMenuEdition.get(1).setEnabled(false);
		_itemMenuEdition.add( new JMenuItemRaccourci(TEXT_EFFACER,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_EFFACER),
											KeyEvent.VK_DELETE, "Supprimer la sélection"));
        _itemMenuEdition.get(2).setEnabled(false);
		_itemMenuEdition.add( new JMenuItemRaccourci(TEXT_TOUS_SELECT,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_TOUS_SELECT),
											KeyEvent.VK_A,KeyEvent.CTRL_MASK,"Selectionner tous les element"));
		_itemMenuEdition.add( new JMenuItemRaccourci(TEXT_PREFERENCE,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_PREFERENCE),
											"Préférences..."));

		// On charge les looks&feels disponibles
		loadAvailableLookAndFeel();

		// Items du menu Aide
		_itemMenuAide.add( new JMenuItem(TEXT_MANUEL,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_MANUEL)));
		_itemMenuAide.add( new JMenuItem(TEXT_PAGE_ACCUEIL,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_PAGE_ACCUEIL)));
		_itemMenuAide.add( new JMenuItemRaccourci(TEXT_A_PROPOS,Utilitaire.chargerImage(GestureRecognition.PATH_IMG + ICON_A_PROPOS)));


        // Creation du Timer mettant à jour le menu
        timer = createTimer();
	}

	/**
	 *	Cette méthode place les composants de la fenetre
	 */
	private void placeComponents() {
        /*
         *	On lie les items aux menus
         */
        // Menu Fichier
		_menuFichier.add(_itemMenuFichier.get(0));
		_menuFichier.add(_itemMenuFichier.get(1));
		_menuFichier.add(new JSeparator());
		_menuFichier.add(_itemMenuFichier.get(2));
		_menuFichier.add(_itemMenuFichier.get(3));
        _menuFichier.add(new JSeparator());
		_menuFichier.add(_itemMenuFichier.get(4));
		_menuFichier.add(new JSeparator());
		_menuFichier.add(_itemMenuFichier.get(5));

        // Menu Edition
		_menuEdition.add(_itemMenuEdition.get(0));
		_menuEdition.add(_itemMenuEdition.get(1));
		_menuEdition.add(_itemMenuEdition.get(2));
        _menuEdition.add(_itemMenuEdition.get(3));
		_menuEdition.add(new JSeparator());
		_menuEdition.add(_itemMenuEdition.get(4));

		// Menu Look&feels
		Iterator iter = _itemMenuLF.iterator ();
		while (iter.hasNext ())
			_menuLF.add((JMenuItem)iter.next ());

		// Menu Aide
		_menuAide.add(_itemMenuAide.get(0));
		_menuAide.add(new JSeparator());
		_menuAide.add(_itemMenuAide.get(1));
		_menuAide.add(new JSeparator());
		_menuAide.add(_itemMenuAide.get(2));

        /*
         *	On lie les menus à la barre de menu
         */
		add(_menuFichier);
		add(_menuEdition);
        add(_menuLF);
		add(_menuAide);
	}

    /**
     * Méthode renvoyant un timer prêt à démarrer
     */
    private Timer createTimer() {
        // Création d'une instance de listener associée au timer
        ActionListener action = new ActionListener() {

            // Méthode appelée à chaque tic du timer
            public void actionPerformed(ActionEvent event) {
                // On vérifie s'il existe des shapes copiées.
                //  Si c'est le cas, on active la fonction "Coller". Sinon, on la désactive.
                getItem(TEXT_COLLER).setEnabled(_frameMain.canvasHasTag(InkMachine.TAG_SHAPE_HOVERED));
                getItem(TEXT_EFFACER).setEnabled(_frameMain.canvasHasTag(InkMachine.TAG_SHAPE_HOVERED));
             }
        };

        // Création d'un timer qui génère un tic
        // chaque SLEEP_TIME millième de seconde
        return new Timer(SLEEP_TIME, action);
    }


    /**
     *	Créer les items du menu Look&feel
     */
    private void loadAvailableLookAndFeel() {
    	// On récupère la Map contenant les L&F disponibles
    	Map <String, String>mapLaF = Utilitaire.getLookAndFeelsMap();
    	Iterator iter = mapLaF.keySet ().iterator ();

    	// On parcourt l'iterateur de la map
    	while( iter.hasNext ()) {
		 	_itemMenuLF.add( new JMenuItem((String)iter.next ()));
    	}
    }


    /**
     *	Methode qui retourne une référence à l'item dont le nom est identique
     *		à celui donné en argument
     *
     *	@param nomItem
     *			Nom de l'item recherché
     *
     *	@return
     *			Référence de l'item recherché
     **/
     public JMenuItem getItem(String nomItem) {
     	JMenuItem cible = null;

     	// On cherche l'item correspondant dans les menus, sous-menus, items, sous-items
		for (int i = 0;i < _itemMenuFichier.size ();i++) {
			if ((_itemMenuFichier.get(i).getText()).equalsIgnoreCase (nomItem))
				cible = _itemMenuFichier.get(i);
		}
		for (int i = 0;i < _itemMenuEdition.size ();i++) {
			if ((_itemMenuEdition.get(i).getText()).equalsIgnoreCase (nomItem))
				cible = _itemMenuEdition.get(i);
		}
        
     	return cible;
     }

    /**
     *	Methode qui active l'item dont le nom est identique
     *		à celui donné en argument
     *
     *	@param nomItem
     *			Nom de l'item a activer
     **/
     public void activateItem(String nomItem) {
     	JMenuItem cible = null;

     	// On cherche l'item correspondant dans les menus, sous-menus, items, sous-items
		for (int i = 0;i < _itemMenuFichier.size ();i++) {
			if ((_itemMenuFichier.get(i).getText()).equalsIgnoreCase (nomItem))
				cible = _itemMenuFichier.get(i);
		}
		for (int i = 0;i < _itemMenuEdition.size ();i++) {
			if ((_itemMenuEdition.get(i).getText()).equalsIgnoreCase (nomItem))
				cible = _itemMenuEdition.get(i);
		}

        // On l'active
        cible.setEnabled(true);
     }
}
